package com.zeus.core.rule;

import com.zeus.common.utils.TimeUtils;
import com.zeus.core.context.ZeusContext;

/**
 * 聚合规则-阈值-次数为主
 * 0、如配置时间为1分钟，阈值次数为10 为例子
 * 1、错误时间间隔小于1分钟，发送的错误次数达到了阈值10，则进行报警级别刷新，提升报警级别P3，错误次数达到20次，报警提升报警级别P2....
 * 2、每15秒执行一次的定时任务, (前置条件，错误次数满足当前报警级别设置的阈值) 在错误开始的1分钟后进行第一次报警，第二次报警为第一次报警后的2分钟后，第三次报警为第二次报警后的3分钟后...
 *
 * @author f1ybear_wang  2022/3/3 3:18 下午
 */
public class GatherRuleThresholdCount extends AbstractGatherRuleThreshold {

    /**
     * 下次发送时间
     * 初始化第一次发送时间
     */
    private Long nextSendTime = lastDate + TimeUtils.minuteToMilliseconds(ZeusContext.getContext().getThresholdTime());

    public GatherRuleThresholdCount() {
        super();
    }

    @Override
    public boolean isCanSendReport() {
        if (this.startDate == null || this.lastDate == null) {
            return false;
        }
        if (this.getCount() >= ZeusContext.getContext().getThresholdNumber(this.levelEnum)) {
            return true;
        }
        if (this.getCount() < ZeusContext.getContext().getThresholdNumber(this.levelEnum)) {
            return false;
        }

        if (System.currentTimeMillis() >= this.nextSendTime) {
            return true;
        }
        return false;
    }

    @Override
    public void sendMessageSuccess() {
        super.sendMessageSuccess();
        // 刷新时间
        refreshSendTime();
    }

    /**
     * 刷新下次发送时间
     *
     * @author f1ybear_wang  2022/3/3 4:56 下午
     */
    private void refreshSendTime() {
        this.nextSendTime = System.currentTimeMillis() + ((long)(this.sendSuccessCount.get() + 1)
            * TimeUtils.minuteToMilliseconds(ZeusContext.getContext().getThresholdTime()));
    }


}
